Enviado em 13/08/2011 - 23:55h
Olá moderadores e colaboradores.
#!/bin/bash
#
#: package: Acessos (***)
#: file: meuipnet.sh
#: since: 2011-08-13 23:03 (GMT -03:00)
#: author: Geraldo T. Albuquerque - Twitter: @AprendiNoLinux ou @GA_Tux
#: version: 0.73a Alfa
#: dir: Scripts/libs. ( Se usar independente, coloque em um dir do seu path )
#------------------------------------------------------------------------------
#: objectives: Pega IP atual da máquina na Net, salva e mostra na tela.
#------------------------------------------------------------------------------
# Pode receber até 2 parâmetros.
# Em $1 = diretório + arquivo final com o ip, ex: /tmp/meu_ip_net.txt
# Em $2 = "IP" Só mostrará o nº do IP e mais nada.
# Caso não envie nenhum parâmetro, mostra na tela e gera aquivo padrão.
#------------------------------------------------------------------------------
#: comments: Contém dependência de serviços de terceiros.
#: Faz acesso ao site: whatismyip.com
#: Você pode trocar o serviço por outro de sua preferência.
#------------------------------------------------------------------------------
#: TODO Falta melhorar recebimento de parâmetros.
#: XXX Não tenho certeza como fazer a validação do IP na net. HELP-ME
#: XXX Fiz vários testes com IPs válidos e inválidos. Não tenho IPv6 pra testes.
#------------------------------------------------------------------------------
# Se adicionar no .bashrc (profile), deixe tudo configurado, exemplo:
# meuipnet /tmp/meuarquivo.txt (Assim sempre mostrará na tela)
#------------------------------------------------------------------------------
function meuipnet()
{
# Suporta uso de alias nos comandos: rm (apagar) e mv (mover).
# Poderia usar o which -fpP [comando] para mostrar local real.
# Já o whereis faz parte de qualquer instalação, foi este então.
# whereis - b [executável], retornará se encontrar: exec: /dir/exec
# Deve ter n maneiras de fazer este teste. Por hora vai a POG.
clear
local _DIR_EXEC_MV _DIR_EXEC_RM _VALIDA_IP _SO_NUM_IP _ECHO_TRACO
local _MEU_PENULTIMO_IP _MEU_IP_OLD _MEU_IP_NET RED NC
local _ARQ_OLD _ARQ_ATUAL _ARQ_TMP _IP_IGUAL
_ECHO_TRACO="#------------------------------------------------------------------------------"
RED='\e[1;31m' # Vermelho berrando.
NC='\e[0m' # Sem Côr
# TODO Só o arquivo atual está sendo tratado em parâmetros.
_ARQ_ATUAL="/tmp/ip_net_agora.txt"
_ARQ_OLD="/tmp/ip_net_old.txt"
_ARQ_TMP="/tmp/tmp_ip_net.txt"
# Se passou o diretório e nome do arquivo final, será usado.
# Outros arquivos irá gravar no diretório /tmp
[ $1 ] && _ARQ_ATUAL=$1
# Talvez tenha avisado que vai querer só o número de IP e nada mais.
[ $2 ] && _SO_NUM_IP=$2
_IP_IGUAL=0 # Default para IP diferente.
# XXX Tem outra forma de usar o whereis sem usar o sed ? HELP-ME.
_DIR_EXEC_MV=$(whereis -b mv | sed 's/mv: //')
_DIR_EXEC_RM=$(whereis -b rm | sed 's/rm: //')
# Pegando o penúltimo ip. Prevendo problemas se não existir.
if test -e "$_ARQ_OLD"
then
_MEU_PENULTIMO_IP=$(cat "$_ARQ_OLD")
else
_MEU_PENULTIMO_IP="Novo"
echo $_MEU_PENULTIMO_IP > "$_ARQ_OLD"
fi
# Testa se existe o arquivo. Carrega o arq. ou coloca "Novo" na var.
if test -e "$_ARQ_ATUAL"
then
_MEU_IP_OLD=$(cat "$_ARQ_ATUAL")
else
_MEU_IP_OLD="Novo"
echo $_MEU_IP_OLD > "$_ARQ_ATUAL"
fi
# TODO Se desejar trocar de serviço, este é o local.
# TODO Se não devolver somente o IP, veja o exemplo sem automação.
# TODO Saiba que não existem garantias sobre este serviço.
# ----> inicio automation. Pegar o IP atual e joga no arquivo temporário.
# ---->
# ---->
wget http://automation.whatismyip.com/n09230945.asp -q -O "$_ARQ_TMP"
_MEU_IP_NET=$(cat "$_ARQ_TMP")
# ---->
# ---->
# ----> fim do automation.
# Caso o automation pare de funcionar, comente e use este abaixo.
# Limpa tudo deixando apenas o número do IP atual.
# ----> inicio da captura usando navegação normal.
# ---->
# ---->
# wget http://www.whatismyip.com/tools/ip-address-lookup.asp -q -O "$_ARQ_TMP"
# _MEU_IP_NET=$(cat "$_ARQ_TMP" | grep "IP:" | sed 's/.*value="// ; s/" .*//')
# ---->
# ---->
# ----> fim da captura da navegação normal da página.
# Tentando verificar se o IP é válido.
# TODO Achei esta validação na net e nem lembro onde foi.
_VALIDA_IP=$(echo $_MEU_IP_NET | egrep '^(((1[0-9]|[1-9]?)[0-9]|2([0-4][0-9]|5[0-5]))\.){3}((1[0-9]|[1-9]?)[0-9]|2([0-4][0-9]|5[0-5]))$')
if test -z "$_VALIDA_IP"
then
# Não validou o IP, vai abortar processo.
# TODO Testei bastante e parece estar funcionando. Testem e feedback.
_VALIDA_IP=0 # Forçando valor 0 ( falha )
# Lança um alerta sobre a falha na validação do número do IP.
echo -e "# ${RED} NÃO VALIDOU seu IP: {NC}]$_MEU_IP_NET "
# XXX Tenho dúvida das diferenças no na saída do exit.
# XXX Quando deve ser vazio, 0,1,2. ? HELP-ME.
exit 1 # Padrão de retorno de Erro
fi
# Faz comparação para saber se o IP mudou.
if [ "$_MEU_IP_NET" == "$_MEU_IP_OLD" ] || [ "$_MEU_IP_OLD" == "Novo" ]
then
_IP_IGUAL=1 # Preventivamente não fará nada com os arquivos depois.
# Só vai mostrar o IP atual padrão.
if [ "$_SO_NUM_IP" != "IP" ]
then
echo
echo -e "$_ECHO_TRACO"
echo -e "# Arq: $_ARQ_ATUAL - Ip NET: [${RED}$_MEU_IP_NET${NC}] "
echo -e "$_ECHO_TRACO"
fi
else
# Mostrará IP atual, anterior e penúltimo.
if [ $_MEU_IP_OLD="Novo" ];then _IP_IGUAL=0;fi # Força atualizar quando é novo.
if [ "$_SO_NUM_IP" != "IP" ]
then
echo
echo -e "$_ECHO_TRACO"
echo -e "# Ip é: [${RED}$_MEU_IP_NET${NC}] Anterior: [$_MEU_IP_OLD] Penúltimo: [$_MEU_PENULTIMO_IP]"
echo -e "$_ECHO_TRACO"
fi
fi
if [ "$_IP_IGUAL" -eq 0 ] # IP atual foi alterado.
then
# Removendo o arquivo anterior
if test -e "$_ARQ_OLD"
then
$_DIR_EXEC_RM -f "$_ARQ_OLD"
fi
# Move/Renomeia do arq. atual que já existia antes.
if test -e "$_ARQ_ATUAL"
then
$_DIR_EXEC_MV -f "$_ARQ_ATUAL" "$_ARQ_OLD"
fi
# Agora posso salvar o IP que chegou diferente.
echo $_MEU_IP_NET > $_ARQ_ATUAL
fi
# Verifica se passou o 2º parâmetro com a string "IP"
# Se ela foi passada, irá retornar apenas o IP
if [ "$_SO_NUM_IP" == "IP" ]
then
echo "$_MEU_IP_NET"
fi
}
# $1 = arq de saída. $2 = "IP" só mostra o número.
# Se não enviar parâmetros, assume que você quer ver o IP formatado.
meuipnet $1 $2
exit 0
#==============================================================================
# Variáveis todas locais:
# mode:shell-script
# sh-shell:bash
# End:
#==============================================================================